home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / sun4.md / fastBootAsm.s < prev    next >
Text File  |  1992-12-18  |  3KB  |  137 lines

  1. /*
  2.  * fastBootAsm.s -
  3.  *
  4.  *     Contains code that is the first executed upon restart.
  5.  *
  6.  * Copyright (C) 1985 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. .seg    "data"
  11. .asciz "$Header: /cdrom/src/kernel/Cvsroot/kernel/mach/sun4.md/fastBootAsm.s,v 9.1 92/08/10 18:01:27 mgbaker Exp $ SPRITE (Berkeley)"
  12. .align 8
  13. .seg    "text"
  14.  
  15. #include "machConst.h"
  16. #include "machAsmDefs.h"
  17.  
  18. .align 8
  19. .seg    "text"
  20. .globl    _MachDoFastBoot
  21. _MachDoFastBoot:
  22.     mov    %psr, %g1
  23.     or    %g1, MACH_DISABLE_INTR, %g1    /* lock out interrupts */
  24.  
  25.     /* Turn off caching */
  26.     set    VMMACH_SYSTEM_ENABLE_REG, %g4
  27.     lduba    [%g4] VMMACH_CONTROL_SPACE, %g5
  28.     andn    %g5, VMMACH_ENABLE_CACHE_BIT | VMMACH_ENABLE_DVMA_BIT, %g5
  29.     stba    %g5, [%g4] VMMACH_CONTROL_SPACE
  30.  
  31.     /* Set up windows */
  32.     andn    %g1, MACH_CWP_BITS, %g1        /* set cwp to 0 */
  33.     set    MACH_ENABLE_FPP, %g2
  34.     andn    %g1, %g2, %g1            /* disable fp unit */
  35.     mov    %g1, %psr
  36.     mov    0x2, %wim    /* set wim to window right behind us */
  37.  
  38.     /* start in context 0 */
  39.     set    VMMACH_CONTEXT_OFF, %g4        /* set %g4 to context offset */
  40.     stba    %g0, [%g4] VMMACH_CONTROL_SPACE
  41.  
  42.     /*
  43.      * We need to copy the initialized data from where it was stored
  44.      * to where it should be.  We copy from storedData to etext for
  45.      * storedDataSize bytes.  This is done in all contexts.
  46.      XXX
  47.      * In this code, %g1 is segment, %g2 is
  48.      * context, %g3 is pmeg, and %g4 is offset in control space to context
  49.      * register.  %g5 contains seg size.
  50.      */
  51.     /*
  52.      * Get destPtr in %g4.
  53.      */
  54.     set    _etext, %g4
  55.     /*
  56.      * Get number of bytes in %g2.
  57.      */
  58.     set    _edata, %g2
  59.     sub    %g2, %g4, %g2
  60.     /*
  61.      * Get srcPtr in %g3.
  62.      */
  63.     set    _storedData, %g3
  64. /*    add    %g4, 8, %g4  This would seem to be right, but breaks it. */
  65. CopyData:
  66.     ldd    [%g3], %g6
  67.     std    %g6, [%g4]
  68.     add    %g3, 8, %g3
  69.     add    %g4, 8, %g4
  70.     subcc    %g2, 8, %g2
  71.     bg    CopyData
  72.     nop
  73.     
  74. /*
  75.  * Force a non-PC-relative jump to the real start of the kernel.
  76.  */
  77.     set    begin, %g1
  78.     jmp    %g1                /* jump to "begin" */
  79.     nop
  80. begin:
  81.     /*
  82.      * Zero out the bss segment.
  83.      */
  84.     set    _edata, %g2
  85.     set    _end, %g3
  86.     cmp    %g2, %g3    /* if _edata == _end, don't zero stuff. */
  87.     be    doneZeroing
  88.     nop
  89.     clr    %g1
  90. zeroing:
  91.     /*
  92.      * Use store doubles for speed.  Both %g0 and %g1 are zeroes.
  93.      */
  94.     std    %g0, [%g2]
  95.     add    %g2, 0x8, %g2
  96.     cmp    %g2, %g3
  97.     bne    zeroing
  98.     nop
  99. doneZeroing:
  100.     /* Set variable that refreshes tbr to my trap address. */
  101.     set    _machTBRAddr, %g2
  102.     mov    %tbr, %g3
  103.     and    %g3, MACH_TRAP_ADDR_MASK, %g3
  104.     st    %g3, [%g2]
  105.  
  106.     /*
  107.      * Now set the stack pointer to my own stack for the first kernel
  108.      * process.  The stack grows towards low memory.  I start it at
  109.      * the beginning of the text segment (CAREFUL: if loading demand-paged,
  110.      * then the beginning of the text segment is 32 bytes before the
  111.      * first code.  Set it really at the beginning of the text segment and
  112.      * not at the beginning of the code.), and it can grow up to
  113.      * MACH_KERN_START.
  114.      *
  115.      * The %fp points to top word on stack of one's caller, so it points
  116.      * to the base of our stack.  %sp points to the top word on the
  117.      * stack for our current stack frame.   This must be set at least
  118.      * to enough room to save our in registers and local registers upon
  119.      * window overflow (and for main to store it's arguments, although it
  120.      * doesn't have any...).
  121.      */
  122.  
  123. #ifdef NOTDEF
  124.     /*
  125.      * Set main_Debug to true for debugging during boot.
  126.      */
  127.     set    _main_Debug, %g1
  128.     set    1, %g2
  129.     st    %g2, [%g1]
  130. #endif /* NOTDEF */
  131.     set    MACH_STACK_START, %fp
  132.     set    (MACH_STACK_START - MACH_FULL_STACK_FRAME), %sp
  133.     andn    %sp, 0x7, %sp            /* double-word aligned */
  134.  
  135.     call    _main
  136.     nop
  137.